﻿#include "ustring.h"
#include "../../_global.h"
#include "../containerscommon.h"

#ifdef _DEBUG
//#ifdef _CRTDBG_MAP_ALLOC
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
//#endif 
#endif 


UString::UString():DataContainerBase(){

}

UString::UString(__int64 _ID):DataContainerBase(_ID){

}

UString::~UString(){
	
}

long UString::parse(SPtr<FileContainer> _inFileContainer,long _offsetInData){

	long dataSize;
	char *dataBuf=NULL;

  if(preParse(_inFileContainer,_offsetInData,&dataBuf,&dataSize)!=1)return -1;
	if(dataBuf==NULL)return -5;

	//При установке уникального идентификатора есть 2 случая
	//1.Когда объект имеет контейнер - он получает такой же идентификатор что и контейнер (например при вызове parse())
	//2.Но когда объект является частью данных внешнего контейнера, заданного при помощи (parse(SPtr<FileContainer> _inFileContainer,long _offsetInData))
	//то он не получает идентификатора т.е конструкция setID(getFileContainer().p()->getID()); присвоит идентификатору -1
	setID(getFileContainer().p()->getID());

	if(dataSize<4)return -4;
	wchar_t *bufWChar;
  long wbufSize;
	
	memcpy((void *)(&wbufSize),(void *)dataBuf,4);
	
	if(wbufSize<=0 || wbufSize>dataSize)return -6;
	bufWChar=new wchar_t[wbufSize+1];
	memcpy((void *)bufWChar,(void *)(dataBuf+4),wbufSize*2);

	bufWChar[wbufSize]='\0';
	wstr=bufWChar;
	delete [] bufWChar;
	bufWChar=NULL;

	return wbufSize*2+4;

}

long UString::parse(){
	if(getFileContainer().isNULLPtr())return -1;
	if(getFileContainer().p()->getContainerType()!=CT_USTRING)return -3;
	return parse(getFileContainer(),0);
}

int UString::join(){

	if(preJoin()!=1)return -1;
	if(checkAndSetObjectsAtIDs()<0)return -2;

  //сборка данных в контейнер:
	getFileContainer().p()->setContainerType(CT_USTRING);
	getFileContainer().p()->setID(getID());

	if(wstr.size()<=0) {
    return 0;
	}
	
	char* data;
	long size;
	
	size=wstr.size()*2+4;
	data=new char[size];
	((long *)data)[0]=wstr.size();
	memcpy((void *)(data+4),(void *)(wstr.data()),size-4);
	getFileContainer().p()->setDataCopy(data,size);
	delete [] data;
	data=NULL;
	return 0;

}

int UString::checkAndSetObjectsAtIDs(){
  return 0;
}




